//Internet上的主机需要IP地址才能联入网络。在计算机系统内部，IP地址（IPv4）是一个32位的整数。但是为了便于表达，人们将它转换为点分十进制形式。所谓点
分十进制形式，就是将32位整数的四个字节分别转换为一个0~255之间的整数，然后把这四个整数用点连接起来的表示形式。例如：整数 - 1455049865
（十六进制表示为0xA945B377），其四个字节的十六进制值分别是A9、45、B3和77，对应的十进制值为169、69、179和119，因此对应的点分十进制IP地址为：
169.69.179.119。
//
//和IP地址对应的还有一个概念：子网掩码。子网掩码也是一个32位的整数，这个整数的二进制表示由一串连续的1和一串连续的0组成，子网掩码也可以表示成点分十
进制的形式，例如255.255.255.0（十六进制为0xFFFFFF00），这个子网掩码由24个1和8个0组成。
//
//每个IP地址都有一个对应的子网掩码。子网掩码为1的位对应在IP地址中为网络ID，子网掩码为0的位对应在IP地址中为主机ID。如果将IP地址中的主机ID部分清零，
则可以得到该主机IP所在的网络的IP地址。例如上面的IP地址169.69.179.119，如果子网掩码为255.255.255.0，则其所在网络的IP地址为169.69.179.0。
//
//请设计一个IP地址类，该类存储一个IP地址及对应的子网掩码信息。通过下面写好的main函数来使用IP地址类。
#include<iostream>
#include<string>
using namespace std; 
class IPAddr
{
    int m_n;
    int m_m;

public:
    IPAddr(int n, int m)
{
    m_n = n;
    m_m = m;
 
}
  void  showIPInfo()
 {
      cout << ((m_n >> 24) & 0xff) << "." << ((m_n >> 16) & 0xff) << "." << ((m_n >> 8) & 0xff) << "." << (m_n & 0xff) << endl;

      if (m_m == 24)
      {
          cout << "255.255.255.0" << endl;
      }
       if (m_m == 20)
      {
          cout << "255.255.240.0" << endl;
      }
       if (m_m == 16)
      {
          cout << "255.255.0.0" << endl;
      }
       if (m_m == 8)
      {
          cout << "255.0.0.0" << endl;
      }
     
      int i = 0;
      for (i=0; i <(32- m_m); i++)
      {
          m_n= (m_n&(~(1 << i)));

      }
      cout << ((m_n >> 24) & 0xff) << "." << ((m_n >> 16) & 0xff) << "." << ((m_n >> 8) & 0xff) << "." << (m_n & 0xff) << endl;
  }

};
int main() {
    int n, m;
    cin >> n >> m;
    IPAddr myip(n, m);
    myip.showIPInfo();
    return 0;
}
/*return value |= 1 << bit_number;
value &= ~(1 << bit_number);*/
